package com.atguigu.scala.ch12.sec02

import java.io.File
import scala.io.Source
import scala.language.implicitConversions

/**
  * 基本数据类型一般都对应一个Rich*，为什么比如int就能直接指明RichInt中的方法呢？
  * 原因就在于隐式转换，当int调用一个方法，但是这个方法不是你自己的方法的时候，
  * 那么scala的编译器就会在上下文中找一个函数，这个函数就是implicit开头的，
  * 然后如果有这个函数，就会把当前的值转化为这个类型，如果转换成功了，
  * 就会这个调用这个方法，在scala的核心包里面，已经定义好了，Sting往StingOps的转换也是通过隐式转换实现的。
  * 那么接着说上面的Fraction类，我希望在不改变类的情况下提供一个美化的输出，
  * 这个时候我们可以定义一个新的类BeaitifulFraction
  */
object Main extends App {
  class RichFile(val from: File) {
    def read = Source.fromFile(from.getPath).mkString
  }

  implicit def file2RichFile(from: File) = new RichFile(from)

  val contents = new File("data/RichFile.scala").read
  println(contents)
}

/*
object Main extends App {
  implicit class RichFile(val from: File) extends AnyVal {
    def read = Source.fromFile(from.getPath).mkString
  }

  val contents = new File("RichFile2.scala").read
  println(contents)
}*/
